package com.xhj.mybatis.scripting.xmltags;

import java.util.List;

/**
 * MixedSqlNode
 *
 * @author XJks
 * @description MixedSqlNode 表示由多个 SqlNode 组成的“混合”节点，通过实现 SqlNode 接口，这个类可以像单个节点一样被使用。
 */
public class MixedSqlNode implements SqlNode {

    /**
     * 子节点列表，存储组成混合节点的多个 SqlNode 实例
     */
    private final List<SqlNode> contents;

    /**
     * 构造函数
     *
     * @param contents 子节点列表
     */
    public MixedSqlNode(List<SqlNode> contents) {
        this.contents = contents;
    }

    /**
     * apply 方法将当前节点应用到传入的 DynamicContext（动态上下文）中。
     *
     * @param context 包含正在构建的 SQL 文本、参数映射、变量等运行时信息。
     * @return 返回 true：表示该节点已成功应用，处理流程可以继续执行后续节点。返回 false：表示该节点决定停止后续节点的执行（例如 if/choose 条件不满足时）。
     */
    @Override
    public boolean apply(DynamicContext context) {
        // 遍历 contents 列表中的每一个子节点，并对每个子节点调用它们自己的 apply 方法。所有子节点都使用同一个 context，子节点可以向 context 写入生成的 SQL、参数等
        contents.forEach(node -> node.apply(context));
        return true;
    }
}
